// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import router from './router'
import iView from 'iview'
import VueResource from 'vue-resource'
//引入自定义常量
import config from './config/config'
//引入自定义工具类
import utils from './utils/utils'
import 'iview/dist/styles/iview.css'

Vue.config.productionTip = false
Vue.use(iView)
Vue.use(VueResource)
//让vue-resource发请求时携带cookie,一定要加在Vue.use(VueResource)后面
Vue.http.options.xhr = {withCredentials: true}
Vue.use(config)
Vue.use(utils)

var _vue = new Vue({
  el: '#app',
  router: router,
  template: '<router-view></router-view>',
  created() {
    const _this = this;
    /**
     * <p>
     * 增加统一的vue-resource拦截器，可以在发送请求之前增加一些数据以及增加一些判断
     * 并且可以做全局异常的处理
     * </p>
     * @param request 请求
     */
    Vue.http.interceptors.push(function (request, next) {//拦截器
      // 跨域携带cookie
      request.credentials = true;
      next(function (response) {
        if (response.status === 0) {
          _this.$Notice.error({title: '错误', desc: "服务器通信错误，请稍后重试!"});
        } else if (response.status === 404) {
          _this.$Notice.error({title: '错误', desc: "您访问的资源地址：" + response.url + "无效!!"});
        } else if (response.status === 500) {
          _this.$Notice.error({title: '错误', desc: "服务器发生异常，请稍后重试!"});
        }
      })
    });
  }
});

/**
 * <p>
 * 全局前置守卫
 * </p>
 * @param to 是一个路由对象,表示即将要进入的目标
 * @param from 也是一个路由对象，表示当前导航正要离开的路由
 * @param next 是一个方法
 *        1. 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数
 *        2. next(): 进行管道中的下一个钩子。如果全部钩子执行完了，则导航的状态就是 confirmed (确认的)。
 *        3. next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮)，那么 URL 地址会重置到 from 路由对应的地址。
 *        4. next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断，然后进行一个新的导航。你可以向 next 传递任意位置对象，且允许设置诸如 replace: true、name: 'home' 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。
 *        5. next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例，则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。
 */
router.beforeResolve((to, from, next) => {
  //全局导航的钩子,通常用来判断用户是否登录，或者登录前后的一些操作
  //1. 判断路由是否需要登录的权限
  if (to.meta.requireAuth) {
    console.info("这个地址需要登录:" + to.fullPath);
    //2. 发送请求，到后台看看当前用户是否是登录状态
    _vue.$http.post(_vue.apiUrl() + 'session/', {}, {
      emulateJSON: true
    }).then((response) => {
      if (response.body.success) {
        _vue.$Message.success("用户" + response.body.username);
        next();
      } else {
        _vue.$Message.error("当前用户没有登录，请重新登录!!");
        next({path: "/"});
      }
    });
  }
});
